#include <iostream>
#include <sstream>
#include <string>
#include <jsoncpp/json/json.h>

const std::string serialize(){
    // 序列化
    // 1. 创建一个Value对象
    Json::Value root;
    root["name"] = "weihe";
    root["age"] = 18;
    root["score"].append(80);
    root["score"].append(85.4);
    root["score"].append(65.1);

    // 创建工厂类对象StreamWriteBuilder
    Json::StreamWriterBuilder swb;
    // 工厂类对象创建WriteStream对象
    Json::StreamWriter *sw = swb.newStreamWriter();
    // WriteStrream对象把Value对象序列化到stringstream对象中
    std::stringstream ss;
    int n = sw->write(root, &ss);
    if(n != 0){
        std::cout << "jsoncpp serialize faild" << std::endl;
        return "";
    }
    delete sw;
    return ss.str();
}
void unserialize(const std::string &str){
    // 反序列化
    // 1. 创建一个CharReaderBuilder工厂类对象
    Json::CharReaderBuilder crb;
    // 2. 使用工厂类对象创建一个CharReader对象
    Json::CharReader *cr = crb.newCharReader();
    // 3. 定义一个Json::Value对象
    Json::Value root;
    std::string err;
    // 4. 使用CharReader对象把stringstream对象中的json字符串反序列化到Value对象中
    bool ret = cr->parse(str.c_str(), str.c_str() + str.size(), &root, &err);
    if(ret == false){
        std::cout << "jsoncpp unserialize faild" << std::endl;
        return;
    }
    // 5. 遍历Value对象获取格式数据
    std::cout << "name: " << root["name"].asString() << std::endl;
    std::cout << "age: " << root["age"].asInt() << std::endl;
    for(int i = 0; i < root["score"].size(); i++){
        std::cout << "score " << i << ": " << root["score"][i].asInt() << std::endl;
    }
}
int main(){
    // 序列化
    std::string s1 = serialize();
    std::cout << s1 << std::endl;

    // 反序列化
    unserialize(s1);
    return 0;
}